package com.lekang.quartz.task;

import java.util.Date;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.lekang.common.utils.DateUtils;
import com.lekang.le.domain.Contract;
import com.lekang.le.mapper.ContractMapper;

/**
 * 合同状态更新定时器
 *
 * @author system
 */
@Component("contractTask")
public class ContractStatusUpdateTask {
    private static final Logger log = LoggerFactory.getLogger(ContractStatusUpdateTask.class);

    @Autowired
    private ContractMapper contractMapper;

    /**
     * 定时检查合同状态
     * 每天凌晨1点执行一次
     * 根据合同开始时间和结束时间更新合同状态：
     * 未生效：当前时间 < 合同开始时间
     * 生效中：合同结束时间 > 当前时间 >= 合同开始时间
     * 已过期：合同结束时间 < 当前时间
     * 已失效：已解除的合同
     */
    public void updateContractStatus() {
        log.info("开始执行合同状态更新定时任务，执行时间：{}", DateUtils.getNowDate());

        // 查询所有非已失效状态的合同
        Contract queryCondition = new Contract();
        List<Contract> contracts = contractMapper.selectContractList(queryCondition);

        if (contracts != null && !contracts.isEmpty()) {
            int updatedCount = 0;
            Date now = new Date();

            for (Contract contract : contracts) {
                // 跳过已失效的合同
                if ("已失效".equals(contract.getContractStatus())) {
                    continue;
                }

                // 判断合同状态并更新
                String newStatus = null;

                // 如果合同已经解除，则状态为已失效
                if (contract.getTerminationTime() != null) {
                    newStatus = "已失效";
                } 
                // 当前时间小于合同开始时间，状态为未生效
                else if (now.before(contract.getStartDate())) {
                    newStatus = "未生效";
                } 
                // 当前时间大于等于合同开始时间且小于等于合同结束时间，状态为生效中
                else if ((now.equals(contract.getStartDate()) || now.after(contract.getStartDate())) 
                        && (now.equals(contract.getEndDate()) || now.before(contract.getEndDate()))) {
                    newStatus = "生效中";
                } 
                // 当前时间大于合同结束时间，状态为已过期
                else if (now.after(contract.getEndDate())) {
                    newStatus = "已过期";
                }

                // 如果状态有变化，则更新
                if (newStatus != null && !newStatus.equals(contract.getContractStatus())) {
                    contractMapper.updateContractStatus(contract.getId(), newStatus);
                    updatedCount++;
                    log.info("更新合同ID：{} 状态从 {} 变更为 {}，合同开始时间：{}，合同结束时间：{}",
                            contract.getId(), contract.getContractStatus(), newStatus, 
                            contract.getStartDate(), contract.getEndDate());
                }
            }

            log.info("合同状态更新定时任务执行完成，共更新{}条记录", updatedCount);
        } else {
            log.info("合同状态更新定时任务执行完成，没有需要更新的记录");
        }
    }
}
